#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 5

typedef struct
{
    int *data; // 指向存放数据的数组
    int front, rear;
    int que_size;
} ArrayQueue;

// 初始化队列
ArrayQueue *new_array_queue()
{
    ArrayQueue *que = malloc(sizeof(ArrayQueue));
    que->data = malloc(sizeof(int) * MAX_SIZE);
    que->front = -1;
    que->rear = -1;
    que->que_size = 0;

    return que;

}

// 入队(尾插法)
void push(ArrayQueue *q, int data)
{
    if (q->que_size == MAX_SIZE)
    {
        printf("队列已满 \n");
        return ;
    }

    q->rear = (q->rear + 1) % MAX_SIZE;// 通过取余操作实现 rear 越过数组尾部后回到头部

    q->data[q->rear] = data;
    
    if (q->que_size == 0)
    {
        q->front = q->rear;
    }
    
    
    q->que_size++;
}

// 访问队首元素
int peek(ArrayQueue *q)
{
    if (q->que_size == 0)
    {
        printf("队列为空 \n");
        return -1;
    }

    return q->data[q->front];
    
}

// 出队
int pop(ArrayQueue *q)
{
    int domp = peek(q);
    if (q->que_size == 0)
    {
        printf("队列为空 \n");
        return -1;
    }
    q->front = (q->front + 1) % MAX_SIZE;
    q->que_size--;
    return domp;
}

/* 析构函数 */
void delArrayQueue(ArrayQueue *q)
{
    free(q->data);
    free(q);
}

int main(int argc, char const *argv[])
{
    ArrayQueue *q = new_array_queue();
    push(q,9);
    printf("%d \n",q->data[q->rear]);
    return 0;
}
